<?php

namespace Sisesporte\Service;

use Doctrine\ORM\EntityManager;
use Sisesporte\Constant\TipoSituacaoTurmaConstant;
use Sisesporte\Entity\Configurator;
use Sisesporte\Auth\PessoaAuth;

class TurmaService extends AbstractService {

    protected $entity;

    public function __construct(EntityManager $em) {
        parent::__construct($em);
        $this->entity = "Sisesporte\Entity\Turma";
        date_default_timezone_set('America/Sao_Paulo');
    }

    public function insert(array $data) {

        $sqHorarioInicio = $this->em->getReference('Sisesporte\Entity\HorarioFuncionamento', $data['sqHorarioInicio']);
        $data["sqHorarioInicio"] = $sqHorarioInicio;

        $sqHorarioTermino = $this->em->getReference('Sisesporte\Entity\HorarioFuncionamento', $data['sqHorarioTermino']);
        $data["sqHorarioTermino"] = $sqHorarioTermino;

        $sqNivel = $this->em->getReference('Sisesporte\Entity\TipoNivelEquipe', $data['sqNivel']);
        $data["sqNivel"] = $sqNivel;

        $sqTurmaDia = $this->em->getReference('Sisesporte\Entity\TurmaDia', $data['sqTurmaDia']);
        $data["sqTurmaDia"] = $sqTurmaDia;

        $sqTipoFaixaEtaria = $this->em->getReference('Sisesporte\Entity\TipoFaixaEtaria', $data['sqTipoFaixaEtaria']);
        $data["sqTipoFaixaEtaria"] = $sqTipoFaixaEtaria;

        if ($data["inSorteio"] == TRUE) {
            $sqTipoSituacao = $this->em->getReference('Sisesporte\Entity\TipoSituacaoTurma', TipoSituacaoTurmaConstant::A_SER_SORTEADA);
            $data["sqSituacaoTurma"] = $sqTipoSituacao;
        } else {
            $sqTipoSituacao = $this->em->getReference('Sisesporte\Entity\TipoSituacaoTurma', TipoSituacaoTurmaConstant::ABERTO);
            $data["sqSituacaoTurma"] = $sqTipoSituacao;
        }
        $sqModalidadeProfessor = $this->em->getRepository('Sisesporte\Entity\ModalidadeProfessor')->findBy(array('sqModalidade' => $data["sqModalidade"]), NULL);

        $sqModalidade = $this->em->getReference('Sisesporte\Entity\ModalidadeProfessor', $sqModalidadeProfessor[0]->getSqModalidadeProfessor());
        $data["sqModalidadeProfessor"] = $sqModalidade;

        $pessoaAuth = new PessoaAuth();
        $sqUsuario = $this->em->getReference('Sisesporte\Entity\Pessoa', $pessoaAuth->getLoggedUser()->sqPessoa);
        $data["sqUsuario"] = $sqUsuario;

        $dataAtual = date('d/m/Y');
        $data["dtCadastro"] = (string) $dataAtual;
        $data['coTurma'] = $this->_gerarCodigoTurma($data);

        $entity = new $this->entity($data);
        $this->em->persist($entity);
        $this->em->flush();

        return $entity;
    }

    public function update($id, array $data) {

        $sqHorarioInicio = $this->em->getReference('Sisesporte\Entity\HorarioFuncionamento', $data['sqHorarioInicio']);
        $data["sqHorarioInicio"] = $sqHorarioInicio;

        $sqHorarioTermino = $this->em->getReference('Sisesporte\Entity\HorarioFuncionamento', $data['sqHorarioTermino']);
        $data["sqHorarioTermino"] = $sqHorarioTermino;

        $sqNivel = $this->em->getReference('Sisesporte\Entity\TipoNivelEquipe', $data['sqNivel']);
        $data["sqNivel"] = $sqNivel;

        $sqTurmaDia = $this->em->getReference('Sisesporte\Entity\TurmaDia', $data['sqTurmaDia']);
        $data["sqTurmaDia"] = $sqTurmaDia;

        $sqTipoFaixaEtaria = $this->em->getReference('Sisesporte\Entity\TipoFaixaEtaria', $data['sqTipoFaixaEtaria']);
        $data["sqTipoFaixaEtaria"] = $sqTipoFaixaEtaria;

        $sqTipoSituacao = $this->em->getReference('Sisesporte\Entity\TipoSituacaoTurma', TipoSituacaoTurmaConstant::ABERTO);
        $data["sqSituacaoTurma"] = $sqTipoSituacao;

        $data['coTurma'] = $this->_gerarCodigoTurma($data);

        $entity = $this->em->getReference($this->entity, $id);
        $entity = Configurator::configure($entity, $data);

        $this->em->persist($entity);
        $this->em->flush();

        return $entity;
    }

    /**
     * Retorna Array de Turmas Abertas de acordo com a Modalidade Seleiconada
     * @param type int $sqModalidade
     * @return array Turma
     */
    public function getTurmaAbertaByModalidade($sqModalidade = NULL) {
        $repo = $this->em->getRepository($this->entity);
        return $repo->getTurmaAbertaByModalidade($sqModalidade);
    }

    private function _gerarCodigoTurma(array $data = NULL) {
        $dia = 0;
        switch (substr($data['sqTurmaDia']->getDeDia(), 0, 3)) {
            case "Seg";
                $dia = 2;
                break;
            case "Ter";
                $dia = 3;
                break;
            case "Qua";
                $dia = 4;
                break;
            case "Qui";
                $dia = 5;
                break;
            case "Sex";
                $dia = 6;
                break;
            case "Sab";
                $dia = 7;
                break;
            case "Dom";
                $dia = 1;
                break;
        }

        $coTurma = $data['sqModalidade'] . $dia . str_replace(":", "", $data['sqHorarioInicio']->getNoHorario()) . "-" . $data['inSemestre'] . "º/" . $data['nuAno'];
        return $coTurma;
    }

    public function updateSituacaoSorteada($id) {

        $sqTipoSituacao = $this->em->getReference('Sisesporte\Entity\TipoSituacaoTurma', TipoSituacaoTurmaConstant::SORTEADA);

        $entity = $this->em->getReference($this->entity, $id);
        $entity->setSqSituacaoTurma($sqTipoSituacao);

        $this->em->persist($entity);
        $this->em->flush();

        return $entity;
    }

    public function findPreMatriculaVinculada($id) {
        $params = array('sqTurma' => $id);
        $entity = $this->em->getRepository("Sisesporte\Entity\PreMatricula")->findBy($params);

        return $entity;
    }

    public function updateSetStAtivoFalse($id) {
        $entity = $this->em->getReference($this->entity, $id);
        $entity->setStAtivo(false);

        $this->em->persist($entity);
        $this->em->flush();

        return $entity;
    }

}
